package com.sixth.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitmqConfig {

    /**
     * TTL（Time-To-Live）交换机名称
     */
    public static final String TTL_EXCHANGE = "wx_order_exchange";

    /**
     * TTL队列名称
     */
    private static final String TTL_QUEUE = "wx_order_queue";

    /**
     * 死信交换机名称
     */
    public static final String DLX_EXCHANGE = "wx_dlx_exchange";

    /**
     * 死信队列名称
     */
    private static final String DLX_QUEUE = "wx_dlx_queue";

    /**
     * 声明TTL交换机
     *
     * @return TTL交换机
     */
    @Bean("wxOrderExchange")
    public DirectExchange wxOrderExchange() {
        return new DirectExchange(TTL_EXCHANGE, true, false);
    }

    /**
     * 声明TTL队列，并绑定到死信交换机
     *
     * @return TTL队列
     */
    @Bean("wxOrderQueue")
    public Queue wxOrderQueue() {
        return QueueBuilder.durable(TTL_QUEUE)
                .ttl(30000)  // TTL 设置为 60 秒
                .deadLetterExchange(DLX_EXCHANGE)
                .build();
    }


    /**
     * 声明死信交换机
     *
     * @return 死信交换机
     */
    @Bean("wxDlxExchange")
    public DirectExchange wxDlxExchange() {
        return new DirectExchange(DLX_EXCHANGE, true, false);
    }

    /**
     * 声明死信队列
     *
     * @return 死信队列
     */
    @Bean("wxDlxQueue")
    public Queue wxDlxQueue() {
        return QueueBuilder.durable(DLX_QUEUE).build();
    }

    /**
     * 绑定TTL队列到TTL交换机
     *
     * @param queue    TTL队列
     * @param exchange TTL交换机
     * @return 绑定关系
     */
    @Bean
    public Binding bindingTtl(@Qualifier("wxOrderQueue") Queue queue,
                              @Qualifier("wxOrderExchange") DirectExchange exchange) {
        // 使用指定的路由键绑定队列和交换机
        return BindingBuilder.bind(queue).to(exchange).with("");
    }

    /**
     * 绑定死信队列到死信交换机
     *
     * @param queue    死信队列
     * @param exchange 死信交换机
     * @return 绑定关系
     */
    @Bean
    public Binding bindingDlx(@Qualifier("wxDlxQueue") Queue queue,
                              @Qualifier("wxDlxExchange") DirectExchange exchange) {
        // 使用指定的路由键绑定死信队列和死信交换机
        return BindingBuilder.bind(queue).to(exchange).with("");
    }
}
